package lintulaskenta.pulautin;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

/******************************************************************************
 * 25m säteen omaavien poikkeustarkistin v1.0                                 *
 * @author Jarkko Nyman                                                       *
 *                                                                            *
 * Luo 25m poikkeuksellisen säteen omaavien pisteiden osalta oliolistan.      *
 * Käyttö tapahtuu tarkistaOnko25mSade()-funktiolla joka kertoo onko juuri    *
 * kyseinen piste poikkeuksellinen säteeltään. Palauttaa true jos kyseessä on *
 * poikkeus ja false mikäli ei.                                               *
 *                                                                            *
 * Ryhmän sisäinen työkalu vanhan perättäistietokannan datan purkuun. Ei      *
 * Tarkoitettu muille loppukäyttäjille.                                       *
 *               ---  Ainoastaan testikäyttöä varten! ----                    *
 ******************************************************************************/
public class Sade25m {

    /*Käytön alussa luodaan mainissa tai vast oliot komennolla "Sade25m.luoPoikkeusOliot()"
     *Tämän jälkeen kokeillaan Sade25m.tarkistaOnko25mSade(int reitinNro, int vuosi, int pisteNro)-funktiolla onko
     * kyseessä poikkeuspiste vai ei.
     */
    //Vain muutamia reittejä joissa poikkeussäteisiä pisteitä. Tehty turhan tarkistuksen vähentämiseksi
    public static int[] poikkeukset = {5010, 5020, 5021, 5031, 5044, 5051, 5054, 5115, 5132, 5135, 5179, 5185, 5218,};
    private int reittiNro;
    private int vuosi;
    private int pisteNro;
    private int biotooppi;
    //Staattinen lista kaikista niistä pisteistä joissa on poikkeussäde
    public static ArrayList<Sade25m> poikkeusOliot;
    //Kovakoodattu polku. Vaihdettava tarvittavaan. doh.
    private static final String sade25mTiedostoPolku = "/Users/jukkapajunen/Documents/Koulu/OhTuProje/Ohtuprojektin tietoja kasattuna/sade25m.dat";

    //lukee poikkeuspisteet olioiksi
    public static void luoPoikkeusOliot() throws FileNotFoundException {
        Scanner tiedosto = new Scanner(new File(sade25mTiedostoPolku));
        poikkeusOliot = new ArrayList<Sade25m>();
        while (tiedosto.hasNextLine()) {

            String rivi = tiedosto.nextLine();
//            System.out.println("tehdään otus rivistä: " + rivi);
            Sade25m poikkeus = new Sade25m();
            poikkeus.setBiotooppi(Integer.parseInt(rivi.substring(15, 17)));
            poikkeus.setReittiNro(Integer.parseInt(rivi.substring(1, 5)));
            if (rivi.charAt(6) == ' ') {
                poikkeus.setPisteNro(Integer.parseInt(rivi.substring(7, 8)));
            } else {
                poikkeus.setPisteNro(Integer.parseInt(rivi.substring(6, 8)));
            }
            poikkeus.setVuosi(Integer.parseInt(rivi.substring(9, 13)));
            if (poikkeusOliot.add(poikkeus)) {
//                System.out.println("lisätty!");
            }

        }

    }

    //debuggausmetodi
    public void tulostaTiedot() {
        for (Sade25m p : Sade25m.poikkeusOliot) {
        }
    }

    public Sade25m() {
    }

    //palauttaa true jos tarkistettava piste on säteeltään poikkeuksellisesti 25m normaalin 50m sijasta
    public static boolean tarkistaOnko25mSade(int reitti, int vuosi, int piste) {
        for (int r : poikkeukset) {
            if (r == reitti) {
                for (Sade25m p : poikkeusOliot) {
                    if (reitti == p.getReittiNro()) {
                        if (piste == p.getPisteNro()) {
                            if (vuosi >= p.getVuosi()) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    public int getBiotooppi() {
        return biotooppi;
    }

    public void setBiotooppi(int biotooppi) {
        this.biotooppi = biotooppi;
    }

    public int getPisteNro() {
        return pisteNro;
    }

    public void setPisteNro(int pisteNro) {
        this.pisteNro = pisteNro;
    }

    public int getReittiNro() {
        return reittiNro;
    }

    public void setReittiNro(int reittiNro) {
        this.reittiNro = reittiNro;
    }

    public int getVuosi() {
        return vuosi;
    }

    public void setVuosi(int vuosi) {
        this.vuosi = vuosi;
    }

    public static ArrayList<Sade25m> getPoikkeusOliot() {
        return poikkeusOliot;
    }

    public static void main(String[] args) throws Exception {
        Sade25m.luoPoikkeusOliot();
        Sade25m.tarkistaOnko25mSade(5010, 1986, 3);
    }
}
